package com.competition.web.admin.queue;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;



/**
 * 消息发布者
 * 
 * @author 111
 */
@Component
public class SysMsgQueueProducer<T> {

	private static Logger logger = LoggerFactory.getLogger(SysMsgQueueProducer.class);

	@Autowired
	private SysMsgQueue<T> sysMsgQueue;
	/**
	 * 是否存在消息
	 */
	private boolean emptyFlag = true;

	private Thread thread;

	public void init() {
		logger.info("消息队列生产者服务");
	}

	/**
	 * 拉取系统未发送数据
	 */
	public void pullData(T orderPayParam) {
//		try {
//			// 使用信号量，消费信号量如信号量为0阻塞.等待通知：队列执行完毕或者有新的消息
//			logger.info("生产者：等待队列执行完毕或新消息");
//			MsgQueueConstant.producerSemaphore.acquire();
//			// 此步骤为异步线程，会发生消息还没插入数据库，就会查询待发送消息，此时会查询不到。所以加阻塞等待消息插入数据库中，在查询执行
////			Thread.sleep(1000);
//		} catch (InterruptedException e) {
//			e.printStackTrace();
//		}
		// logger.info("++++++++生产消息：{}", JSONObject.toJSONString(unsentMsg));
		sysMsgQueue.add(orderPayParam);
		// 添加信号量+1，通知消费者进行消费
		logger.info("生产者：通知消费者");
		MsgQueueConstant.cosumerSemaphore.release();
	}
	
	
	

	/**
	 * 拉取系统未发送数据
	 */
	public void pullData(List<T> orderPayParam) {
//		try {
//			// 使用信号量，消费信号量如信号量为0阻塞.等待通知：队列执行完毕或者有新的消息
//			logger.info("生产者：等待队列执行完毕或新消息");
//			MsgQueueConstant.producerSemaphore.acquire();
//			// 此步骤为异步线程，会发生消息还没插入数据库，就会查询待发送消息，此时会查询不到。所以加阻塞等待消息插入数据库中，在查询执行
////			Thread.sleep(1000);
//		} catch (InterruptedException e) {
//			e.printStackTrace();
//		}
		// logger.info("++++++++生产消息：{}", JSONObject.toJSONString(unsentMsg));
		sysMsgQueue.addAll(orderPayParam);
		// 添加信号量+1，通知消费者进行消费
		logger.info("生产者：通知消费者");
		MsgQueueConstant.cosumerSemaphore.release();
	}

}
